// Copyright (C) 2006 Taylor L. Riché <riche@cs.utexas.edu>
//  
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software 
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// 	$Id: TCP6_Packet.cc 949 2008-09-23 21:29:59Z djwhitebread $	
//

#include "TCP6_Packet.hh"

namespace pktTypes {

int
TCP6_Packet::chksum() 
{
  uint32_t sum = 0;
  // The following code is borrowed from the libnet project, and
  // falls under the following license:

  /*  Copyright (c) 1998 - 2004 Mike D. Schiffman
      <mike@infonexus.com>
      * All rights reserved. 
      * 
      * Redistribution and use in source and binary forms, with or without 
      * modification, are permitted provided that the following conditions 
      * are met: 
      * 1. Redistributions of source code must retain the above copyright 
      *    notice, this list of conditions and the following disclaimer. 
      * 2. Redistributions in binary form must reproduce the above copyright 
      *    notice, this list of conditions and the following disclaimer in the 
      *    documentation and/or other materials provided with the distribution. 
      * 
      * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 
      * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
      * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
      * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
      * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
      * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
      * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
      * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
      * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
      * SUCH DAMAGE. 
      *  
      */
  
  // START LIBNET CODE
  
//   struct libnet_tcp_hdr *tcph_p =
//     (struct libnet_tcp_hdr *)(buf + ip_hl);

  tcpHdr->check = 0;
  // if (this->getIPVersion == IP6VERSION)
  // {
  //   sum = libnet_in_cksum((u_int16_t *)&ip6h_p->ip_src, 32);
  // }
  // else
  // {
  sum = in_cksum((uint16_t *)&ip6Hdr->ip6_src.s6_addr16, 32);
  //  }
  uint16_t proto = IPPROTO_TCP;
  sum += htons(proto) + htons(getPayloadLength());
//  sum += proto + tcpLength;
  sum += in_cksum((u_int16_t *)tcpHdr, getPayloadLength());
  tcpHdr->check = CKSUM_CARRY(sum);

  // END LIBNET CODE
  return tcpHdr->check;
}
}
